import textract from 'textract'
import formidable from 'formidable'
import path from 'path'
import mongoose from 'mongoose'
import _ from 'lodash'
import { exec } from 'child_process'

const Info = mongoose.model('Info')

export const fetchInfo = async ctx => {
  const filePath = await getFilePath(ctx)
  try {
    let info
    if (
      _.endsWith(filePath, '.html') ||
      _.endsWith(filePath, '.xls') ||
      _.endsWith(filePath, '.xlsx')
    ) {
      info = await handleInfo(filePath, filePath)
    } else {
      const convertPath = await libreofficeConvert(filePath)

      info = await handleInfo(convertPath, filePath)
    }

    ctx.body = {
      success: true,
      data: info
    }
  } catch (e) {
    ctx.body = {
      success: false,
      error: '处理上传文件出错'
    }
  }
}

export const saveInfo = async ctx => {
  const opts = ctx.request.body

  const values = Object.values(opts)

  try {
    const saveInfo = await Info.insertMany(values)
    ctx.body = {
      success: true,
      data: saveInfo
    }
  } catch (e) {
    ctx.body = {
      success: false,
      error: '保存信息出错'
    }
  }
}

export const updateInfo = async ctx => {
  const opts = ctx.request.body

  // 更新数据的条件查询
  var wherestr = { _id: opts.id }

  // 执行更新数据
  delete opts['id']

  try {
    const updateInfo = await Info.updateOne(wherestr, opts)
    ctx.body = {
      success: true,
      data: updateInfo
    }
  } catch (e) {
    ctx.body = {
      success: false,
      error: '更新数据出错'
    }
  }
}

/** 2019-03-07
 * @Author: 刘宇琳
 * @Desc: 保存文件，并获取文件路径
 */
function getFilePath(ctx) {
  return new Promise((resolve, reject) => {
    const form = new formidable.IncomingForm()
    form.uploadDir = path.resolve(__dirname, '../static/uploads')
    form.keepExtensions = true
    form.maxFieldsSize = 20 * 1024 * 1024
    form.type = true
    console.log('开始获取文件路径')
    form.parse(ctx.req, (err, fields, files) => {
      if (err) {
        reject(err)
      } else {
        resolve(files.file.path)
      }
    })
  })
}

/** 2019-03-07
 * @Author: 刘宇琳
 * @Desc: 解析文件，提取简历信息
 */
function handleInfo(value, originalValue) {
  console.log('开始解析文件')
  return new Promise((resolve, reject) => {
    textract.fromFileWithPath(value, function(error, text) {
      if (error) {
        reject(error)
      } else {
        // 姓名
        let surname = text.match(
          / (赵|钱|孙|李|周|吴|郑|王|冯|陈|楮|卫|蒋|沈|韩|杨|朱|秦|尤|许|何|吕|施|张|孔|曹|严|华|金|魏|陶|姜|戚|谢|邹|喻|柏|水|窦|章|云|苏|潘|葛|奚|范|彭|郎|鲁|韦|昌|马|苗|凤|花|方|俞|任|袁|柳|酆|鲍|史|唐|费|廉|岑|薛|雷|贺|倪|汤|滕|殷|罗|毕|郝|邬|安|常|乐|于|时|傅|皮|卞|齐|康|伍|余|元|卜|顾|孟|平|黄|和|穆|萧|尹|姚|邵|湛|汪|祁|毛|禹|狄|米|贝|明|臧|计|伏|成|戴|谈|宋|茅|庞|熊|纪|舒|屈|项|祝|董|梁|杜|阮|蓝|闽|席|季|麻|强|贾|路|娄|危|江|童|颜|郭|梅|盛|林|刁|锺|徐|丘|骆|高|夏|蔡|田|樊|胡|凌|霍|虞|万|支|柯|昝|管|卢|莫|经|房|裘|缪|干|解|应|宗|丁|宣|贲|邓|郁|单|杭|洪|包|诸|左|石|崔|吉|钮|龚|程|嵇|邢|滑|裴|陆|荣|翁|荀|羊|於|惠|甄|麹|家|封|芮|羿|储|靳|汲|邴|糜|松|井|段|富|巫|乌|焦|巴|弓|牧|隗|山|谷|车|侯|宓|蓬|全|郗|班|仰|秋|仲|伊|宫|宁|仇|栾|暴|甘|斜|厉|戎|祖|武|符|刘|景|詹|束|龙|叶|幸|司|韶|郜|黎|蓟|薄|印|宿|白|怀|蒲|邰|从|鄂|索|咸|籍|赖|卓|蔺|屠|蒙|池|乔|阴|郁|胥|能|苍|双|闻|莘|党|翟|谭|贡|劳|逄|姬|申|扶|堵|冉|宰|郦|雍|郤|璩|桑|桂|濮|牛|寿|通|边|扈|燕|冀|郏|浦|尚|农|温|别|庄|晏|柴|瞿|阎|充|慕|连|茹|习|宦|艾|鱼|容|向|古|易|慎|戈|廖|庾|终|暨|居|衡|步|都|耿|满|弘|匡|国|文|寇|广|禄|阙|东|欧|殳|沃|利|蔚|越|夔|隆|师|巩|厍|聂|晁|勾|敖|融|冷|訾|辛|阚|那|简|饶|空|曾|毋|沙|乜|养|鞠|须|丰|巢|关|蒯|相|查|后|荆|红|游|竺|权|逑|盖|益|桓|公|万俟|司马|上官|欧阳|夏侯|诸葛|闻人|东方|赫连|皇甫|尉迟|公羊|澹台|公冶|宗政|濮阳|淳于|单于|太叔|申屠|公孙|仲孙|轩辕|令狐|锺离|宇文|长孙|慕容|鲜于|闾丘|司徒|司空|丌官|司寇|仉|督|子车|颛孙|端木|巫马|公西|漆雕|乐正|壤驷|公良|拓拔|夹谷|宰父|谷梁|晋|楚|阎|法|汝|鄢|涂|钦|段干|百里|东郭|南门|呼延|归|海|羊舌|微生|岳|帅|缑|亢|况|后|有|琴|梁丘|左丘|东门|西门|商|牟|佘|佴|伯|赏|南宫|墨|哈|谯|笪|年|爱|阳|佟|第五|言|福)[\u4e00-\u9fa5]{1,3}( |,)/g
        )

        surname = _.uniq(
          _.difference(surname, [
            '简历内容',
            '项目经验',
            '项目名称',
            '项目描述',
            '项目经历',
            '全职'
          ])
        )

        // 职位
        const surname1 = _.uniq(text.match(/([\u0391-\uFFE5A-Za-z]+)工程师/g))

        // 电话
        const surname2 = _.uniq(text.match(/1(3|4|5|7|8|9)\d{9}( |,)/g))

        // 邮箱
        const surname3 = _.uniq(
          text.match(
            // eslint-disable-next-line no-useless-escape
            /([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]{0,20}[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}/g
          )
        )

        // 学校
        const surname4 = _.uniq(text.match(/([\u0391-\uFFE5]+)(大学|学院)/g))

        const data = {
          name: surname,
          job: surname1,
          phone: surname2,
          email: surname3,
          school: surname4,
          url: value.substring(value.lastIndexOf('/') + 1) || '',
          originalUrl: originalValue.substring(value.lastIndexOf('/') + 1) || ''
        }

        resolve(data)
      }
    })
  })
}

/** 2019/2/17
 * @Author: 刘宇琳
 * @Desc: 将上传的文件转成html格式
 */
function libreofficeConvert(filePath) {
  const outdir = path.join(__dirname, '../static/uploads')
  const testPath = `libreoffice --convert-to html --outdir ${outdir} ${filePath} --headless --invisible`
  console.log('开始处理文件')
  return new Promise((resolve, reject) => {
    exec(testPath, error => {
      if (error) {
        reject(error)
      } else {
        // 获取文件后缀的路径
        const tmpPath = filePath.substring(0, filePath.lastIndexOf('.'))
        resolve(`${tmpPath}.html`)
      }
    })
  })
}
